// Files (文件) 示例
// 演示 Pascal 中文件操作的基本用法
program p_21_files;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils;  // 系统工具单元，包含常用的系统函数

// 程序主入口
begin
  WriteLn('=== Pascal 文件操作示例 ===');
  WriteLn;
  
  // 1. 创建并写入文本文件
  WriteLn('1. 创建并写入文本文件:');
  var outputFile: Text;
  var filename: String = 'demo.txt';
  
  // 分配文件名
  Assign(outputFile, filename);
  
  // 创建新文件用于写入
  Rewrite(outputFile);
  
  // 写入数据到文件
  WriteLn(outputFile, '这是Pascal文件操作示例');
  WriteLn(outputFile, '第一行数据');
  WriteLn(outputFile, '第二行数据');
  WriteLn(outputFile, '第三行数据');
  WriteLn(outputFile, '文件创建时间: ', DateTimeToStr(Now));
  
  // 关闭文件
  Close(outputFile);
  WriteLn('  已创建文件: ', filename);
  
  WriteLn;
  
  // 2. 读取文本文件
  WriteLn('2. 读取文本文件:');
  var inputFile: Text;
  
  // 分配文件名
  Assign(inputFile, filename);
  
  // 打开已存在的文件用于读取
  Reset(inputFile);
  
  // 读取并显示文件内容
  WriteLn('  文件内容:');
  while not Eof(inputFile) do
  begin
    var line: String;
    ReadLn(inputFile, line);
    WriteLn('    ', line);
  end;
  
  // 关闭文件
  Close(inputFile);
  
  WriteLn;
  
  // 3. 文件状态检查
  WriteLn('3. 文件状态检查:');
  if FileExists(filename) then
    WriteLn('  文件 ''', filename, ''' 存在')
  else
    WriteLn('  文件 ''', filename, ''' 不存在');
  
  var fileSize: Int64 = FileSize(filename);
  WriteLn('  文件大小: ', fileSize, ' 字节');
  
  WriteLn;
  
  // 4. 追加数据到文件
  WriteLn('4. 追加数据到文件:');
  
  // 以追加模式打开文件
  Append(outputFile);
  Assign(outputFile, filename);
  Reset(outputFile);
  
  // 移动到文件末尾
  while not Eof(outputFile) do
  begin
    var tempLine: String;
    ReadLn(outputFile, tempLine);
  end;
  
  // 追加新数据
  WriteLn(outputFile, '追加的数据 - ', DateTimeToStr(Now));
  Close(outputFile);
  
  WriteLn('  数据已追加到文件');
  
  WriteLn;
  
  // 5. 错误处理
  WriteLn('5. 文件操作错误处理:');
  var errorFile: Text;
  var errorFilename: String = 'nonexistent.txt';
  
  Assign(errorFile, errorFilename);
  
  // 尝试打开不存在的文件
  try
    Reset(errorFile);
  except
    on E: Exception do
      WriteLn('  错误: 无法打开文件 ''', errorFilename, ''' - ', E.Message);
  end;
  
  WriteLn;
  
  // 6. 清理 - 删除示例文件
  WriteLn('6. 清理:');
  if FileExists(filename) then
  begin
    Erase(outputFile);  // 删除文件
    WriteLn('  已删除示例文件: ', filename);
  end;
  
  WriteLn;
  WriteLn('演示了 Pascal 中文件操作的基本用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.